<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <script>
        // 如何改变promise状态 3种方式
        // let p = new Promise((resolve,reject)=>{
        //     // 1. resolve函数
        //     // resolve('ok') //pending => fulfilled(resolved)

        //     // 2.reject函数
        //     // reject('err') // pending => rejected

        //     // 3.抛出错误
        //     throw 'err'

        // })
        // console.log(p)






        //执行多个回调
        //当promise改变为对应状态时都会调用
        // let p = new Promise((resolve,reject)=>{
        //     resolve('ok')
        // })

        // // 指定回调 -1
        // p.then(value=>{
        //     console.log(value)
        // })

        // // 指定回调 -2
        // p.then(value=>{
        //     console.log(value)
        // })

        // // 指定回调 -3
        // p.then(value=>{
        //     console.log(value)
        // })


        //改变promise状态和指定回调函数(.then())谁先谁后?


        // let p = new Promise((resolve, reject)=>{
        //     setTimeout(()=>{
        //         resolve('ok')
        //     },1000)
        // })

        // p.then(value=>{
        //     console.log(value)
        // },reason=>{

        // })


        //promise.then()返回的新promise的结果状态由什么决定

        // let p = new Promise((resolve,reject)=>{
        //     resolve('ok')
        // })
        //执行then方法
        // let res = p.then(value=>{
            // console.log(value)
            // 1.抛出错误
            // throw '出错'
            //2.返回结果是 非Promise 类型的对象
            // return 123
            //3.返回结果是一个Promise对象,
            // return new Promise((resolve,reject)=>{
            //     resolve('ok')
            // })
        // },reason=>{
        //     console.log(reason)
        // })

        // console.log(res)



        // promise如何串联多个操作任务



        let p = new Promise((resolve,reject)=>{
            setTimeout(()=>{
                resolve('ok')
            },1000)
        })
        let p11 = p.then(value=>{
            console.log('value1',value)
            // return Promise.reject('err')
        }).then(value=>{
            console.log('value2',value) //undefined
        }).then(value=>{
            console.log('value3',value) //undefined
        })
        // let p11 = p.then(value=>{
        //     return new Promise((resolve, reject)=>{
        //         resolve('ok1')
        //     })
        // }).then(value=>{
        //     console.log('value1',value)
        // }).then(value=>{
        //     console.log('value2',value) //undefined
        // })
        console.log(p11)


        //promise异常穿透
        // let p = new Promise((resolve,reject)=>{
        //     setTimeout(()=>{
        //         resolve('ok')
        //     },1000)
        // })

        // p.then(value=>{
        //     return new Promise((resolve, reject)=>{
        //         resolve('ok1')
        //     })
        // }).then(value=>{
        //     console.log(value)
        //     throw '出错了'
        // }).then(value=>{
        //     console.log(value) //undefined
        // }).catch(reason=>{
        //     console.warn(reason)
        // })



        //如何中断promise链

        // let p = new Promise((resolve,reject)=>{
        //     setTimeout(()=>{
        //         resolve('ok')
        //     },1000)
        // })

        // p.then(value=>{
        //     console.log(value)
        //     //返回一个Pending状态的promise对象,可以中断链
        //     return new Promise(()=>{})
        // }).then(value=>{
        //     console.log(value)
        // }).then(value=>{
        //     console.log(value) //undefined
        // }).catch(reason=>{
        //     console.warn(reason)
        // })




    </script>
</body>
</html>